/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logica;

import dao.GrupoDAO;
import dao.NaveDAO;
import dao.ProductorDAO;
import dao.ReferenciaDAO;
import dao.SustratoDAO;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import modelo.Grupo;
import modelo.Nave;
import modelo.Productor;
import modelo.Referencia;
import modelo.Sustrato;
import modelo.SustratoNave;
import modelo.SustratoNavePK;
import vista.panel.AltaSustrato;

/**
 *
 * @author Elias Mendoza
 */
public class GestionFormularioRegistro {

  public <Registro> boolean insertarFormulario(Registro r) {
    Class clase;
    Object objeto;
    Method guardar;
    Class[] claseParametro;
    Object[] parametro;
    try {
      clase = Class.forName("dao." + r.getClass().getSimpleName() + "DAO");
      objeto = clase.newInstance();
      claseParametro = new Class[1];
      claseParametro[0] = Class.forName("java.lang.Object");
      guardar = clase.getMethod("guardar", claseParametro);
      parametro = new Object[1];
      parametro[0] = r;
      guardar.invoke(objeto, parametro);

    } catch (NoSuchMethodException e) {
      System.out.println("Error al acceder al metodo. " + e);
      return false;
    } catch (SecurityException e) {
      System.out.println("Error al acceder al metodo. " + e);
      return false;
    } catch (InvocationTargetException e) {
      System.out.println("Error al ejecutar el metodo. " + e);
      return false;
    } catch (InstantiationException e) {
      System.out.println("Error al instanciar el objeto. " + e);
      return false;
    } catch (IllegalAccessException e) {
      System.out.println("Error al instanciar el objeto. " + e);
      return false;
    } catch (ClassNotFoundException e) {
      return false;
    }
    return true;

  }
  
    public void consultaProductores(JComboBox cb) {
    ProductorDAO pd = new ProductorDAO();
    List listProductores = pd.consultaTodo();
    for (Object i : listProductores) {
      Productor p = (Productor) i;
      cb.addItem(p);
    }
  }

  public void consultaNaves(JComboBox cb) {
    NaveDAO nd = new NaveDAO();
    List listNaves = nd.consultaTodo();
    for (Object i : listNaves) {
      Nave n = (Nave) i;
      cb.addItem(n);
    }
  }

  public void consultaReferencia(JComboBox cb) {
    ReferenciaDAO rsd = new ReferenciaDAO();
    List listReferencias = rsd.consultaTodo();
    for (Object i : listReferencias) {
      Referencia rs = (Referencia) i;
      cb.addItem(rs);
    }
  }

  public TableModel inicializaTablaGrupos(JTable tablaGruposSustrato) {
    TableModel modeloTabla = new DefaultTableModel() {

      Class[] types = new Class[]{java.lang.Boolean.class, java.lang.Character.class, java.lang.Float.class};

      @Override
      public Class getColumnClass(int columnIndex) {
        return types[columnIndex];
      }
    };

    tablaGruposSustrato.setModel(modeloTabla);
    ((DefaultTableModel) modeloTabla).setColumnIdentifiers(new Object[]{"select", "Grupo", "Gasto/AP"});

    return modeloTabla;
  }

  public void addFila(char sensor, TableModel tabla) {
    Object[] fila = new Object[3];
    fila[0] = false;
    fila[1] = sensor;

    ((DefaultTableModel) tabla).addRow(fila);
  }

  public void consultaGrupos(JTable tablaSustratoGrupos) {
    
    TableModel modeloTabla = inicializaTablaGrupos(tablaSustratoGrupos);
    boolean disponible;
    GrupoDAO gd = new GrupoDAO();
    List listGrupos = gd.consultaTodo();
    for (int con = 65; con <= 90; con++) {
      disponible = true;
      char letra = (char) con;
      if (listGrupos.size() > 0) {
        for (Object i : listGrupos) {
          Grupo rs = (Grupo) i;
          if (rs.getGrupo() == letra) {
            disponible = false;
            break;
          }
        }
      }
      if (disponible) {
        addFila(letra, modeloTabla);
      }
      System.out.println(letra);
    }
  }
  public void registrarSustrato(AltaSustrato interfaz) {
    if (compruebaNumGrupos(interfaz.jTableGruposSustrato)) {
      SustratoDAO sd = new SustratoDAO();
      Sustrato s = new Sustrato();
      s.setConstitucion(interfaz.jTextFieldConstitucion.getText());
      s.setDescripcion(interfaz.jTextFieldDescripcion.getText());
      s.setNombre(interfaz.jTextFieldNombre.getText());
      s.setReferencia((Referencia) interfaz.jComboBoxReferencia.getSelectedItem());
      s.setUltimaModificacion(interfaz.jDateChooserUltModificacion.getDate());
      sd.guardar(s);
      SustratoNavePK snPK = new SustratoNavePK();
      snPK.setSustratoFK(s);
      snPK.setNaveFK((Nave) interfaz.jComboBoxNave.getSelectedItem());
      SustratoNave sn = new SustratoNave();
      sn.setPrimaryKey(snPK);
      sd.guardar(sn);
      registrarGruposSustrato(interfaz.jTableGruposSustrato, s);
      JOptionPane.showMessageDialog(null,"Registro Completo","Registro", JOptionPane.INFORMATION_MESSAGE);
    } else {
      JOptionPane.showMessageDialog(null,"Se ha sobrepasado el limite de grupos <4>","Desbordamiento", JOptionPane.ERROR_MESSAGE);
    }
  }

  public boolean compruebaNumGrupos(JTable tabla) {
    int con = 0;
    for (int i = 0; i < tabla.getModel().getRowCount(); i++) {
      boolean activo = (Boolean) tabla.getModel().getValueAt(i, 0);
      if (activo) {
        con++;
      }
    }
    if (con > 4) {
      return false;
    }
    return true;
  }

  public void registrarGruposSustrato(JTable tabla, Sustrato s) {
    GrupoDAO gd = new GrupoDAO();
    char caracter = 0;
    for (int i = 0; i < tabla.getModel().getRowCount(); i++) {
      boolean activo = (Boolean) tabla.getModel().getValueAt(i, 0);
      if (activo) {
        caracter = (Character) tabla.getModel().getValueAt(i, 1);
        Grupo g = new Grupo();
        g.setGrupo(caracter);
        g.setGasto((Float) tabla.getModel().getValueAt(i, 2));
        g.setSustrato(s);
        gd.guardar(g);
      }
    }
  }
}
